package com.opensource.component.query.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.Mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.opensource.component.query.exception.MpExtendException;
import java.util.List;
import org.apache.ibatis.annotations.Param;

/**
 * @author ZL since on 2021/12/23 下午4:35
 */
public interface ExtendClickhouseBaseMapper<E> extends Mapper<E> {

  /**
   * 多表查询列表
   *
   * @param wrapper 条件包装
   * @return 返回包装类型的对象list
   */
  List<E> selectClickhouseListExtend(
      @Param(Constants.WRAPPER) Wrapper<E> wrapper);

  /**
   * 多表查询单个
   *
   * @param wrapper 条件包装
   * @return 返回包装类型的对象
   */
  default E selectClickhouseOneExtend(Wrapper<E> wrapper) {
    final List<E> result = selectClickhouseListExtend(wrapper);
    if (CollectionUtils.isNotEmpty(result)) {
      if (result.size() == 1) {
        return result.get(0);
      }
      throw new MpExtendException(
          "One record is expected, but the query result is multiple records");
    }
    return null;
  }

  /**
   * 多表查询count
   *
   * @param wrapper 条件包装
   * @return 总数
   */
  long selectClickhouseCountExtend(@Param(Constants.WRAPPER) Wrapper<E> wrapper);

  /**
   * 多表查询分页
   *
   * @param page    分页参数
   * @param wrapper 条件包装
   * @return EV
   */
  Page<E> selectClickhousePageExtend(IPage<E> page, @Param(Constants.WRAPPER) Wrapper<E> wrapper);


  /**
   * 插入
   *
   * @param entity 实体
   * @return 数量
   */
  void insertClickhouseExtend(E entity);

  /**
   * 更新
   *
   * @param wrapper 条件
   * @return 数量
   */
  void updateClickhouseExtend(@Param(Constants.WRAPPER) LambdaUpdateWrapper<E> wrapper);

  /**
   * 删除
   *
   * @param wrapper 实体
   * @return 数量
   */
  void deleteClickhouseExtend(@Param(Constants.WRAPPER) Wrapper<E> wrapper);

}
